package cn.dduan.fool.data.type.base.Integer;

/**
 * Int
 * <p>
 * 注意：
 * 1. 位数：32位（4个字节）的存储空间
 * 2. 取值范围： -2147483648（-2^31）到 2147483647（2^31 - 1）（超出范围会抛出编译错误）
 * 3. 在类中定义的 int 类型变量，如果没有显式初始化，默认值为 0
 * <p>
 * 应用场景：
 *
 * @author dduan
 * @version 1.0
 * @date 2025/2/25
 */
public class MyInt {
    public static void main(String[] args) {
        // MyInt.demoA();
        MyInt.demoB();
    }

    /**
     * 案例1
     *
     * @author dduan
     * @version 1.0
     * @date 2025/3/28
     */
    private static void demoA() {
        int a = 20;
        // 声明时必须赋值，否则抛出：可能尚未初始化变量b
        int b;
        // 编译错误，值超出了 int 类型的取值范围
        // int c = 2147483648;
        System.out.println("a = " + a); // a = 20
        // System.out.println("b = " + b); // b = 0
        // System.out.println("c = " + c); // c = 编译错误

        /**
         * <p>
         * Integer a = 127，Integer b = 127；Integer c = 128，Integer d = 128；，相等吗?
         * Integer a=127这种赋值，是用到了Integer自动装箱的机制。自动装箱的时候会去缓存池里取Integer对象，没有取到才会创建新的对象
         * 如果整型字面量的值在-128到127之间，那么自动装箱时不会new新的Integer对象，而是直接引用缓存池中的Integer对象，超过范围 f==g的结果是false
         */
        Integer d = 127;
        Integer e = 127;

        Integer f = 128;
        Integer g = 128;

        System.out.println(d == e);
        System.out.println(f == g);

        /**
         * <p>
         * 什么是Integer缓存？
         * 因为根据实践发现大部分的数据操作都集中在值比较小的范围，因此 Integer 搞了个缓存池，默认范围是 -128 到 127，
         * 可以根据通过设置 JVM-XX:AutoBoxCacheMax=来修改缓存的最大值，最小值改不了
         *
         * 实现的原理是int 在自动装箱的时候会调用Integer.valueOf，进而用到了IntegerCache
         * 很简单，就是判断下值是否在缓存范围之内，如果是的话去 IntegerCache 中取，不是的话就创建一个新的Integer对象。
         * IntegerCache是一个静态内部类， 在静态块中会初始化好缓存值
         */
        Integer i = Integer.valueOf(a);

        /**
         * <p>
         * String转成Integer，主要有两个方法：
         *   Integer.parseInt(String s)
         *   Integer.valueOf(String s)
         * 不管哪一种，最终还是会调用Integer类内中的 parseInt(String s, int radix)方法
         */
        Integer.parseInt("123");
    }

    /**
     * 案例2
     *
     * @author dduan
     * @version 1.0
     * @date 2025/3/28
     */
    private static void demoB() {
        String a = "5.463374614715576";

        Integer i = Integer.valueOf(a);

        System.out.println("i=" + i);
    }
}
